package com.heihei.decompression;


import com.heihei.config.ConfigProperties;
import com.heihei.constant.MessageConstant;
import com.heihei.util.FileUtilF;
import com.heihei.util.StrUtilF;

import java.io.File;
import java.io.IOException;

/**
 *  获取压缩脚本
 *
 * @version 1.0
 * @since JDK1.8
 * @author duanhengfei
 * @date 2021年01月27日 16:09:57
 */
public class ComDemo {

    public static void main(String[] args) throws IOException {
        start();
    }

    /**
     * 方法描述: 开始执行
     *
     * @param
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月27日 16:10:32
     */
    private static void start() throws IOException {
        System.out.println(">>>压缩文件<<<");
        //获取命令字符串
        String command = getCommandLineStr();
        //获取目标命令文件地址
        File validScriptFile = DeComDemo.getValidScriptFile(ConfigProperties.SCRIPT_PATH);
        FileUtilF.writeTxtFile(command, validScriptFile, "GBK");
        System.out.println("OK");
        System.out.println("生成的脚本位于：" + validScriptFile.getAbsolutePath());
        if(ConfigProperties.COM_PASSWORD != null && ConfigProperties.COM_PASSWORD != "") {
            System.out.println("有密码，密码为：" + ConfigProperties.COM_PASSWORD);
        } else {
            System.out.println("压缩包无密码");
        }
    }

    /**
     * 方法描述: 获取命令字符串
     *
     * @param
     * @Return {@link String}
     * @throws
     * @author duanhengfei
     * @date 2021年01月27日 16:12:59
     */
    private static String getCommandLineStr() {
        System.out.println("请输入源文件目录");
        File validSrcDir = FileUtilF.getValidSrcDir();
//        Scanner sc = new Scanner(System.in);
//        System.out.println("是否要设置密码");
//        String isPassword = sc.nextLine();
//        if("Y".equalsIgnoreCase(isPassword) || "YES".equalsIgnoreCase(isPassword)) {
//            System.out.println("请输入密码（注意：密码会忽略掉前后的空格）");
//            password = sc.nextLine().trim();
//        } else {
//            password = null;
//        }
        File[] childFiles = validSrcDir.listFiles();
        StringBuilder sb = new StringBuilder();
        for (File childFile : childFiles) {
            if(childFile.isDirectory()) {
                //拼接命令
                //获取一行命令
                sb.append(getLineComand(validSrcDir, childFile));
            }
        }
        sb.append("pause");
        return sb.toString();
    }

    public static String getLineComand(File parentFile, File childFile, Boolean isNewLine) {
        return getLineComand(parentFile, childFile, isNewLine, ConfigProperties.COM_PASSWORD);
    }

    public static String getLineComand(File parentFile, File childFile, Boolean isNewLine, String pwd) {
        File targetZipFile = getTargetZipFile(parentFile, childFile);
        StringBuilder sb = new StringBuilder();
        sb.append("\"").append(ConfigProperties.ZIP_PATH).append("\" a \"")
                .append(targetZipFile.getAbsolutePath())
                .append("\" \"")
                .append(childFile.getAbsolutePath())
                .append("\"");
        if(pwd != null && pwd != "") {
            sb.append(" -p\"").append(pwd).append("\"");
        }
        //查询要压缩的文件/目录大小
        long totalSize = FileUtilF.getTotalSizeOfFileOrDir(childFile);
        if(totalSize <= 0) {
            return String.format(MessageConstant.ECHO_EMPTY_DIR, childFile.getAbsolutePath());
        }
        //分卷
        if(ConfigProperties.DIVIDE_FLAG) {
            //大小转换为MB
            int flag = StrUtilF.compareSize(totalSize, ConfigProperties.SECTION_SIZE);
            if(flag > 0) {
                sb.append(" -v").append(ConfigProperties.SECTION_SIZE);
            }
        }
        if(isNewLine) {
            sb.append("\r\n");
        }
        return sb.toString();
    }

    private static File getTargetZipFile(File parentFile, File childFile) {
        File targetZipFile = new File(parentFile, childFile.getName() + ConfigProperties.ZIP_STYLE);
        int index = 1;
        while(targetZipFile.exists()) {
            targetZipFile = new File(parentFile, childFile.getName() + "_" + index + ConfigProperties.ZIP_STYLE);
            index ++;
        }
        return targetZipFile;
    }

    public static String getLineComand(File fileDir, Boolean isNewLine, String pwd) {
        return getLineComand(fileDir.getParentFile(), fileDir, isNewLine, pwd);
    }

    public static String getLineComand(File childFile, Boolean isNewLine) {
        return getLineComand(childFile.getParentFile(), childFile, isNewLine);
    }

    public static String getLineComand(File parentFile, File childFile) {
        return getLineComand(parentFile, childFile, true);
    }
}